/**
 * 
 */
package com.pj.facade;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import cn.dev33.satoken.annotation.SaCheckBasic;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.annotation.SaCheckSafe;
import cn.dev33.satoken.annotation.SaMode;
import cn.dev33.satoken.stp.StpUtil;

/**
 * @author jigq
 *
 * @date 2022年9月9日
 */
@RestController
@RequestMapping("/user/")
public class UserController {

	// 测试登录，浏览器访问： http://localhost:8081/user/doLogin?username=zhang&password=123456
    @RequestMapping("doLogin")
    public String doLogin(String username, String password) {
        // 此处仅作模拟示例，真实项目需要从数据库中查询数据进行比对 
        if("zhang".equals(username) && "123456".equals(password)) {
            StpUtil.login(10001);
            return "登录成功";
        }
        return "登录失败";
    }

    // 查询登录状态，浏览器访问： http://localhost:8081/user/isLogin
    @RequestMapping("isLogin")
    public String isLogin() {
        return "当前会话是否登录：" + StpUtil.isLogin();
    }
    
    @GetMapping("/checkLogin")
    public String checkLogin(){
        StpUtil.checkLogin();
        return "已登录";
    }

    @GetMapping("/hasPerm")
    public String hasPermission(){
        StpUtil.checkPermission("user:select");
            return "true";
//        else return "false";

    }

    @GetMapping("/checkPermAnd")
    public String hasPermissionAnd(){
        StpUtil.checkPermissionAnd("user:select","user:delete");
        return "true";
    }

    @GetMapping("/hasPermOr")
    public String hasPermissionOr(){
        if (StpUtil.hasPermissionOr("user:select","user:delete"))
            return "true";
        else return "false";
    }

    @GetMapping("/hasRole")
    public String hasRole(){
        StpUtil.checkRole("user");
        return "true";

    }

    @GetMapping("/checkRoleAnd")
    public String hasRoleAnd(){
        StpUtil.checkRoleAnd("user","admin");
        return "true";
    }

    @GetMapping("/hasRoleOr")
    public String hasRoleOr(){
        if (StpUtil.hasRoleOr("user2","admin"))
            return "true";
        else return "false";
    }

    @GetMapping("/logout")
    public String logout(){
        StpUtil.logout(1001);
        return "success";
    }

    @GetMapping("/kickout")
    public String kickout(){
        StpUtil.kickout(1001);
        return "success";
    }

    @GetMapping("/disable")
    public String disable(){
        StpUtil.disable(1001, 86400);
        return "success";

    }

    // 登录认证：只有登录之后才能进入该方法
    @SaCheckLogin
    @RequestMapping("info")
    public String info() {
        return "查询用户信息";
    }

    // 角色认证：必须具有指定角色才能进入该方法
    @SaCheckRole("admin")
    @RequestMapping("add1")
    public String add1() {
        return "用户增加";
    }

    // 权限认证：必须具有指定权限才能进入该方法
    @SaCheckPermission("user:add")
    @RequestMapping("add")
    public String add() {
        return "用户增加";
    }

    // 二级认证：必须二级认证之后才能进入该方法
    @SaCheckSafe()
    @RequestMapping("add2")
    public String add2() {
        return "用户增加";
    }

    // Http Basic 认证：只有通过 Basic 认证后才能进入该方法
    @SaCheckBasic(account = "xx:123456")
    @RequestMapping("add3")
    public String add3() {
        return "用户增加";
    }

    // 注解式鉴权：只要具有其中一个权限即可通过校验
    @RequestMapping("atJurOr")
    @SaCheckPermission(value = {"user:add", "user:all", "user:delete"}, mode = SaMode.OR)
    public String atJurOr() {
        return "用户信息";
    }

    // 注解式鉴权：只要具有其中一个权限即可通过校验
    @RequestMapping("userAdd")
    @SaCheckPermission(value = "user:add", orRole = "admin")
    public String userAdd() {
        return "用户信息";
    }
}
